linux 多架构支持

·

Debian 多架构(Multiarch) 与 跨架构模拟(QEMU + binfmt_misc)

  • dpkg --add-architecture + apt install -d 不依赖 QEMU/binfmt
  • 但若想 运行 vim:arm64,就必须用 QEMU/binfmt
  • Multiarch 解决“如何下载/解压 arm64 包”
  • QEMU/binfmt 解决“如何执行 arm64 二进制”
dpkg --print-architecture
dpkg --print-foreign-architectures

# 即使没装 qemu-user-static,也能下载
sudo apt purge qemu-user-static 2>/dev/null
sudo apt clean
sudo dpkg --add-architecture arm64
sudo apt update
sudo apt-get install -d vim:arm64  # ✅ 成功!
dpkg -x /var/cache/apt/archives/vim_*.deb ./vim-arm64
# 尝试运行
./vim-arm64/usr/bin/vim --version
# ❌ 报错:bash: ./vim-arm64/usr/bin/vim: cannot execute binary file: Exec format error
sudo apt install qemu-user-static
./vim-arm64/usr/bin/vim --version
# ✅ 成功
目标所需技术命令示例
下载 arm64 .debMultiarchdpkg --add-architecture arm64 && apt install -d vim:arm64
解压 arm64 文件Multiarchdpkg -x vim_arm64.deb ./
运行 arm64 二进制QEMU + binfmtapt install qemu-user-static && ./vim
容器中跑 arm64QEMU + binfmt + OCIpodman run --platform=linux/arm64 arm64v8/alpine
交叉编译 arm64Multiarch + gccapt install gcc-aarch64-linux-gnu && aarch64-linux-gnu-gcc hello.c

常见问题

如果只做 ① 和 ②,会怎样?

dpkg --add-architecture arm64
apt install vim:arm64
# 然后运行:
/usr/bin/vim
# 可能得到:
# cannot execute binary file: Exec format error
# 因为:
# 系统能装包
# 但内核不知道如何执行 arm64 ELF

如果有 QEMU 但没有 binfmt_misc?

# 你可以:
qemu-aarch64-static /usr/bin/vim
# 但不能直接:
/usr/bin/vim
# 因为:
# 内核不会自动调用 qemu

如果有 binfmt_misc 但没有 QEMU?

# 那么执行会变成:
# No such file or directory
# 因为:
# 内核要调用 /usr/bin/qemu-aarch64-static
# 结果命令不存在

binfmt_misc

内核机制:自动调用解释器运行异构二进制

docker run --privileged --rm tonistiigi/binfmt --install all
docker run -it --rm --platform=linux/loong64 loongarch64/debian uname -a

# qemu-user-static    # 提供 /usr/bin/qemu-*-static 二进制
# binfmt-support      # Debian/Ubuntu 专用:管理 binfmt_misc 持久化
# binfmt-support 会在安装时:
# 将预定义的注册规则写入 /var/lib/binfmt-support/
# 创建 systemd 服务:systemd-binfmt.service
# 启用服务:systemctl enable systemd-binfmt
# 系统级预装 QEMU + binfmt # Debian/Ubuntu # Fedora/RHEL 
sudo apt install qemu-user-static binfmt-support 
sudo dnf install qemu-user-static 

# 用 rootful Podman(临时 sudo)
sudo podman run --privileged --rm tonistiigi/binfmt --install all
# 普通用户运行容器(rootless 安全!)
podman run -it --rm --platform=linux/loong64 loongarch64/debian uname -a

## 复杂、会话级有效、重启失效 —— 不如一句 sudo apt install qemu-user-static
# 1. 创建用户命名空间并挂载 binfmt_misc
unshare --user --map-root-user --mount sh -c '
  mount -t binfmt_misc binfmt_misc /proc/sys/fs/binfmt_misc
  podman run --rm -v /proc/sys/fs/binfmt_misc:/proc/sys/fs/binfmt_misc:rw tonistiigi/binfmt --install loong64
'
# 2. 保持命名空间 alive(后台)
unshare --user --map-root-user --mount --fork sleep infinity &
NS_PID=$!
# 3. 在该命名空间中运行容器
nsenter -U -m -t $NS_PID podman run --platform=linux/loong64 uname -a